package com.gitee.yusugar.common.pojo;

import com.gitee.yusugar.common.YuToolServiceException;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @author Y-sugar
 */
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
public class DataRes<T> implements Serializable {

    public static final String SUCCESS_CODE = "200";
    public static final String FAIL_CODE = "500";

    private String code;
    private String msg;
    private T data;

    private DataRes( String code, String msg, T data ) {
        this.setCode( code ).setMsg( msg ).setData( data );
    }

    /**
     * 基本父方法
     *
     * @param code 是否成功
     * @param msg  消息
     * @param t    数据
     */
    private static <T> DataRes<T> data( String code, String msg, T t ) {
        return new DataRes<>( code, msg, t );
    }

    /**
     * @return 返回操作成功的标志
     */
    public static <T> DataRes<T> success() {
        return data( null );
    }

    /**
     * @param msg 消息
     * @return 返回成功带消息的
     */
    public static <T> DataRes<T> success( String msg ) {
        return data( null, msg );
    }

    /**
     * @param t   数据
     * @param <T> 数据类型
     * @return 返回成功带数据的
     */
    public static <T> DataRes<T> data( T t ) {
        return data( t, "操作成功" );
    }

    /**
     * @param t   数据
     * @param <T> 数据类型
     * @return 返回成功带数据和消息的
     */
    public static <T> DataRes<T> data( T t, String msg ) {
        return data( SUCCESS_CODE, msg, t );
    }

    /**
     * @return 返回错误
     */
    public static <T> DataRes<T> fail() {
        return data( FAIL_CODE, "操作失败", null );
    }

    /**
     * @param msg 错误的消息
     * @return 返回错误
     */
    public static <T> DataRes<T> fail( String msg ) {
        return data( FAIL_CODE, msg, null );
    }

    /**
     * @param code 错误状态码
     * @param msg  错误的消息
     * @return 返回错误
     */
    public static <T> DataRes<T> fail( String code, String msg ) {
        return data( code, msg, null );
    }

    /**
     * 验证返回结果是否为 success
     *
     * @param res 结果
     * @return 验证结果
     */
    public static boolean checkResSuc( DataRes<?> res ) {
        return res.getCode().equals( "200" );
    }

    /**
     * 验证返回结果是否为 success，若不为 suc 则抛出异常
     *
     * @param res 结果
     */
    public static void checkResThrowBy( DataRes<?> res ) {
        checkResThrowBy( res, "服务异常" );
    }

    /**
     * 验证返回结果是否为 success，若不为 suc 则抛出异常
     *
     * @param res 结果
     */
    public static void checkResThrowBy( DataRes<?> res, String msg ) {
        YuToolServiceException.throwBy( !res.getCode().equals( "200" ), msg );
    }

    @Override
    public String toString() {
        return "{\"code\": " + this.getCode() + ", \"msg\": \"" + this.getMsg() + "\", \"data\": \"" + this.getData() + "\"}";
    }
}
